#ifndef _app_manager_type_H__
#define _app_manager_type_H__

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "../app_manager_conf.h"

#if APP_MANAGER_LIB_ENABLE

typedef enum
{
    APP_MANAGER_SUCCESS = 0,       // 成功
    APP_MANAGER_MALLOC_FAIL,       // 内存分配失败
    APP_MANAGER_NAME_NONE,         // 应用名称为空
    APP_MANAGER_FS_ERROR,          // 文件系统错误
    APP_MANAGER_MALLOC_FREE_ERROR, // 内存分配释放错误
    APP_MANAGER_ERROR,             // 其他错误
} app_manager_ret_t;

typedef enum
{
    APP_UI_NONE = 0, // 无UI
    APP_UI_HAVE,     // 有UI
} app_ui_type_t;

typedef enum
{
    APP_VISIBLE = 0, // APP对第三方可见
    APP_INVISIBLE,   // APP对第三不可见
} app_visible_t;

typedef enum
{
    APP_MANAGER_KILL_ALL = 0, // 关闭所有APP进程
    APP_MANAGER_KILL_ONE,     // 关闭指定APP进程，用户数据arg指向要关闭的APP名称
    APP_MANAGER_DEL_UI_ALL,   // 删除除当前正在前台运行的app以外的所有APP的UI缓存
    APP_MANAGER_DEL_UI,       // 删除UI，用户数据arg指向要清除UI缓存的APP名称
    APP_MANAGER_REGISTER_APP, // 注册APP，用户数据arg指向app_register_t结构体
#if APP_MANAGER_ENABLE_APP_UNINSTALL
    APP_MANAGER_SAVE_DATA, // 保存安装、卸载列表数据
#endif
} app_manager_task_t;

#if APP_MANAGER_ENABLE_APP_UNINSTALL
typedef enum
{
    APP_INSTALLED = 0, // 已安装
    APP_UNINSTALLED,   // 未安装
} app_install_status_t;
#endif

typedef struct
{
    const char *name;      // 应用名称，可选
    const char *author;    // 作者，可选
    const char *version;   // 版本号，可选
    app_ui_type_t ui_type; // UI类型，必填
    app_visible_t visible; // 是否对第三方可见，必填
    void *icon;            // 图标，可选

#if APP_MANAGER_ENABLE_APP_UNINSTALL
    void (*install)(void *arg);   // 安装
    void (*uninstall)(void *arg); // 卸载
    void (*update)(void *arg);    // 更新
#endif
    /**
     * @brief 不使用的功能函数注册时填NULL，必要使用的如果不填会死机，如带UI的app必须实现create_ui
     */
    void (*init)(void *arg);               // 初始化,在注册app时调用一次
    void *(*create_ui)(void *arg);         // 创建UI并返回UI对象，有UI的app在打开app时调用
    void (*destroy_ui)(void *arg);         // 销毁UI，用户自行通过任务调用，如GUI可以自动删除则不使用
    void (*load_to_background)(void *arg); // 加载到后台，当app从前台切到到后台时调用
    void (*load_to_foreground)(void *arg); // 加载到前台，arg指向载入动画类型，有UI的app在打开app时调用
    void (*kill_process)(void *arg);       // 杀死进程，用户调用kill任务时调用

} app_register_t;

typedef app_register_t app_manager_register_t;

#if (APP_MANAGER_SUPPORT_RTOS || APP_MANAGER_GUI_USE_MUTEX)
typedef struct
{
    void (*mutex_get_cb)();  // 获得互斥锁权限
    void (*mutex_give_cb)(); // 归还互斥锁权限
} app_manager_mutex_cb_t;
#endif

#endif // APP_MANAGER_LIB_ENABLE

#endif // _app_manager_type_H__